package com.itheima.dao.impl;


import com.itheima.dao.IUserDao;
import com.itheima.domain.User;
import com.itheima.utils.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;


import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class UserDaoImpl implements IUserDao {

    JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSourse());

    //用户名添加


    /**
     * 查询所有user
     *
     * @return
     */
    @Override
    public List<User> FindAll() {
        //定义sql语句
        String sql = "select * from user";
        List<User> users = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
        return users;
    }

    /**
     * 添加用户
     *
     * @param user
     * @return
     */
    @Override
    public int addUser(User user) {
        //1.定义sql
        String sql = "insert into user values(null,?,?,?,?,?,?)";
        //2.调用update
        int row = template.update(sql, user.getName(),
                user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail());
        return row;
    }

    /**
     * 根据id删除用户
     *
     * @param id
     * @return
     */
    @Override
    public int deleteUser(int id) {
        String sql = "delete from user where id=?";
        int update = template.update(sql, id);
        return update;
    }

    /**
     * 根据用户id查询用户
     *
     * @param id
     * @return
     */
    @Override
    public User findUserById(int id) {
        String sql = "select * from user where id=?";
        User user = template.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), id);
        return user;
    }

    /**
     * 更改用户信息
     *
     * @param user
     * @return
     */
    @Override
    public User update(User user) {
        String sql = "update user set name=?,gender=?,age=?,address=?,qq=?,email=? WHERE id=?";
        template.update(sql, user.getName(), user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail(), user.getId());
        return user;
    }

    /**
     * 查询记录总数,查询有条件时候，需要传入条件。
     *
     * @param condition
     * @return
     */
    @Override
    public int findTotalCount(Map<String, String[]> condition) {
        //定义sql语句
        String sql = "select count(*) from user WHERE 1=1 ";
        //在查询条件后面需要拼接条件
        //调用queryForObject方法，查询总记录数
        StringBuilder sb = new StringBuilder(sql);
        //condition是一个Map集合，需要遍历拿到其中的参数
        Set<String> keys = condition.keySet();
        List<Object> params = new ArrayList<>();
        for (String key : keys) {
            //去掉currentPage和rows条件
            if (key.equals("currentPage") || key.equals("rows")) {
                continue;
            }
            //2.2 获取对应的条件值 value
            String value = condition.get(key)[0];
            if (value != null && !"".equals(value)) {
                //2.3动态拼接sql条件
                sb.append(" and "+ key+ " like ?");
                //2.4 将value值保存在params集合中
                params.add("%" + value + "%");
            }
        }
        //3.调用queryForObject方法
        Integer totalCount = template.queryForObject(sb.toString(), Integer.class,params.toArray());
        return totalCount;
    }





    /**
     * 根据start和row查询数据库中的数据,查询的结果需要分页显示，所以传入的参数需要condition
     *
     * @param start
     * @param rows
     * @param condition
     * @return
     */
    @Override
    public List<User> findUserByPage(int start, int rows, Map<String, String[]> condition) {
        //定义分页sql语句
        String sql = "select * from user where 1=1 ";
        //对condition进行查找，找到需要检索的属性 name等属性。
        //定义一个StringBuilder
        StringBuilder sb =new StringBuilder(sql);
        List<Object> params = new ArrayList<>();
        //通过keys的方法遍历Map集合
        Set<String> keys = condition.keySet();
        //筛选过滤掉currentPage和rows属性
        for (String key : keys) {
            if (key.equals("currentPage")||key.equals("rows")){
               continue;
            }
            //获取key对应的value值
            String value = condition.get(key)[0];
            if(value != null && !"".equals(value)){
                //动态拼接sql语句
                sb.append(" and "+key+" like ?");
                //将value值添加到可变参数集合中
                params.add("%"+value+"%");
            }
        }
        //需要分页操作，需要拼接limit条件
        sb.append(" limit ?,?");//第一个？代表本页的起始索引值，第二个？代表每页显示的条目，即为rows
        //添加分页参数
        params.add(start);
        params.add(rows);
        //调用方法
        List<User> users = template.query(sb.toString(), new BeanPropertyRowMapper<>(User.class),params.toArray());

        return users;
    }


}




